﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using UnityEngine;
using System.Reflection;

public class TableDatabase
{
    public int ID;
}
//表格基类
public class ConfigTable<TDatabase, T> : Singleton<T>
    where TDatabase : TableDatabase, new()//约束，TDatabase必须继承TableDatabase父类和必须能new
    where T : new()
{
    //NPC和Role对比 相同的有：
    //索引方式
    //数据存储方式
    //表的读取方式
    Dictionary<int, TDatabase> _cache = new Dictionary<int, TDatabase>();

    protected void load(string tablePath)
    {
        //读表
        //csv格式可以通过Excle打开编辑，但是Unity需要读取的是二进制文件，后缀是.bytes
        var table = Resources.Load<TextAsset>(tablePath);

        //csv文件用utf8编码格式的话就不需要后面这两步就可以直接读取
        var tableStream = new MemoryStream(table.bytes);

        //没使用Using的话要手动关闭流Close
        //var reader = new StreamReader(tableStream, Encoding.GetEncoding("gb2312"));
        //tableStream.Close();
        //reader.Close();

        //使用Using
        using (var reader = new StreamReader(tableStream, Encoding.GetEncoding("gb2312")))
        {
            //跳过第一行,因为第一行的数据我们不需要
            var fieldNameStr = reader.ReadLine();
            var fieldNameArray = fieldNameStr.Split(',');

            //运用反射获取文本中的类型
            List<FieldInfo> allFieldInfo = new List<FieldInfo>();
            foreach (var fieldName in fieldNameArray)
            {

                
                allFieldInfo.Add(typeof(TDatabase).GetField(fieldName));
            }
            //下面正式数据
            var lineStr = reader.ReadLine();
            while (lineStr != null)
            {
                //读到内存
                var itemStrArray = lineStr.Split(',');
                var NpcDB = new TDatabase();
                //对每个字段解析
                //foreach (var field in allFieldInfo)
                for (int i = 0; i < allFieldInfo.Count; i++)
                {
                    var field = allFieldInfo[i];
                    var data = itemStrArray[i];
                    if (allFieldInfo[i].FieldType == typeof(int))
                    {
                        field.SetValue(NpcDB, int.Parse(data));
                    }
                    else if (field.FieldType==typeof(string))
                    {
                        field.SetValue(NpcDB, data);
                    }
                }

                NpcDB.ID = int.Parse(itemStrArray[0]);

             
                //NpcDB.Name = itemStrArray[1];
                //NpcDB.ModelPath = itemStrArray[2];

                _cache[NpcDB.ID] = NpcDB;//

                lineStr = reader.ReadLine();

            }
        }
    }


    //创建索引器
    public TDatabase this[int index]
    {
        get
        {
            TDatabase db;
            _cache.TryGetValue(index, out db);
            return db;
        }
    }
    public Dictionary<int, TDatabase> GetAll()
    {
        return _cache;
    }
    //不同：
    //数据类型
    //文件路径
    //
}


